
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>反射技术 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>反射技术 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Java 反射技术的核心能力是什么？它解决了什么问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Java 反射是一种强大而灵活的机制，它允许程序在运行时动态地获取类的信息并操作类的属性和方法，而无需在编译时事先知道类的类型。它解决了在编译时无法确定要操作的类、方法或属性，需要在运行时进行动态检查和调用的问题。</div>
          </div>
          <div class="card-source">来源: 文档中「反射技术」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Java 反射机制是基于哪个核心包实现的？其基本原理涉及哪几个步骤？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Java 的反射机制是基于 `java.lang.reflect` 包中的一系列类和接口实现的。其原理步骤包括：1. 使用类加载器加载类的字节码文件生成 Class 对象；2. 通过 Class 对象获取类的构造方法、字段、方法等信息；3. 通过构造方法创建类的对象；4. 通过方法对象调用类的方法；5. 通过字段对象访问和修改类的属性。</div>
          </div>
          <div class="card-source">来源: 文档中「反射的基本原理」-「实现原理」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">应用</div>
          <div class="card-question">请列举一个具体的框架（如Spring）是如何利用反射技术实现其核心功能的。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">应用</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring框架利用反射技术实现了依赖注入（DI）和控制反转（IoC）功能。在初始化时，Spring容器通过反射扫描并实例化各个Bean，然后通过反射将它们之间的依赖关系注入到相应的对象中。</div>
          </div>
          <div class="card-source">来源: 文档中「反射的应用场景」-「1. 框架和库的开发」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在通过反射获取类的方法时，`getMethod()` 和 `getDeclaredMethod()` 有什么关键区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`getMethod(String name, Class<?>... parameterTypes)` 用于获取指定的公有方法（包括从父类继承的）。而 `getDeclaredMethod(String name, Class<?>... parameterTypes)` 用于获取类中直接声明的指定方法，无论其访问修饰符是公有还是私有，但不包括继承的方法。</div>
          </div>
          <div class="card-source">来源: 文档中「反射的基本使用」-「2. 获取方法对象」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">使用反射技术会带来哪些主要的性能和安全方面的缺点？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">性能方面，反射操作相比直接调用会产生额外的性能开销，因为它涉及到动态类型检查和方法调用，通常速度较慢。安全方面，反射可以绕过Java的访问权限检查，访问和修改类的私有成员，可能会破坏类的封装性和安全性。</div>
          </div>
          <div class="card-source">来源: 文档中「反射的优缺点」-「缺点」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">文档中将反射比作“镜子”，这个比喻是如何解释反射的本质的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">这个比喻解释了反射的本质：就像镜子可以反射光线让我们看到自己的影像一样，Java的反射技术允许程序在运行时“反射”出类的信息和功能，动态地获取一个对象的内部结构（如属性和方法），从而实现对它的了解和操作。</div>
          </div>
          <div class="card-source">来源: 文档中「反射技术的理解」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在Java反射API中，`Class`、`Method` 和 `Field` 这三个核心类分别扮演什么角色？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`Class` 类是反射的核心，代表了一个类的运行时信息。`Method` 类代表了类的方法，可以通过它来动态调用方法。`Field` 类代表了类的字段（属性），可以通过它来动态地获取和设置字段的值。</div>
          </div>
          <div class="card-source">来源: 文档中「反射的核心类和方法」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">应用</div>
          <div class="card-question">除了框架开发，反射技术还有哪些常见的应用场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">应用</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">常见的应用场景还包括：1. 实现插件化，在运行时动态加载和调用插件；2. 实现动态代理，在运行时动态创建代理对象；3. 解析和处理配置文件，将配置内容映射到Java对象；4. 实现对象的序列化和反序列化。</div>
          </div>
          <div class="card-source">来源: 文档中「反射的应用场景」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">在使用反射时，有哪些需要注意的关键事项以确保代码的健壮性和性能？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">关键注意事项包括：1. 异常处理，需要处理 `ClassNotFoundException`、`NoSuchMethodException` 等异常；2. 性能考虑，避免在性能敏感场景下过度使用；3. 权限检查，谨慎绕过访问权限；4. 缓存，对频繁操作的对象、方法等进行缓存以提升性能。</div>
          </div>
          <div class="card-source">来源: 文档中「反射的基本使用」-「注意事项和技巧」部分</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
